package com.pawernode.service;


import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;

/**
 * 消息服务类，负责发送消息到RabbitMQ
 */
@Service
@Slf4j
public class MessageService {

    // 这就是模板方法设计模式
    @Resource
    private RabbitTemplate rabbitTemplate;

    /**
     * 初始化方法，配置RabbitTemplate的确认和返回回调
     */
    @PostConstruct
    public void init() {
        // 开启生产者的确认模式
        rabbitTemplate.setConfirmCallback(
                (correlationData, ack, cause) -> {
                    if (!ack) {
                        log.error("消息没有到达交换机，原因为：{}", cause);
                        // TODO 重新发消息或者记录错误日志
                    }
                }

        );

        rabbitTemplate.setReturnsCallback(
                returnedMessage -> {
                    log.error("消息没有从交换机正确的投递（路由）到队列，原因为：{}",returnedMessage.getReplyText());
//                    TODO 记录错误日志，给程序员发短信或者邮件
                }
        );
    }

    /**
     * 发送消息到RabbitMQ
     */
    public void sendMsg() {
        MessageProperties messageProperties = new MessageProperties();
        // 设置单条消息的持久化，默认是持久化
        messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
        Message message = MessageBuilder.withBody("hello rabbitmq".getBytes())
                .andProperties(messageProperties).build();
        rabbitTemplate.convertAndSend("exchange.cluster", "info", message);
        log.info("消息发送完毕，发送时间为：{}", new Date());
    }
}
